package br.com.jvet.entidade;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import br.com.jvet.constante.TipoCadastro;

@Entity
@Table(name = "tbcliente")
@SequenceGenerator(name = "cliente_seq", sequenceName = "cliente_seq", initialValue = 1, allocationSize = 1)
public class Cliente implements Serializable {

	private static final long serialVersionUID = -2876947960705994871L;
	@Id
	@GeneratedValue(generator = "cliente_seq", strategy = GenerationType.SEQUENCE)
	private int codigo;
	@OneToOne(cascade = CascadeType.ALL)
	private DadosCadastro dadosCadastro;
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "cliente",orphanRemoval=true)
	// @JoinTable(name = "tbcliente_animais", joinColumns = { @JoinColumn(name =
	// "idcliente", referencedColumnName = "codigo") }, inverseJoinColumns = {
	// @JoinColumn(name = "idanimal", referencedColumnName = "codigo") })
	private List<Animal> animais;

	public Cliente() {
		super();
		dadosCadastro = new DadosCadastro();
		dadosCadastro.setTipoCadastro(TipoCadastro.CLIENTE);
		animais = new ArrayList<Animal>();
	}

	public int getCodigo() {
		return codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}

	public DadosCadastro getDadosCadastro() {
		return dadosCadastro;
	}

	public void setDadosCadastro(DadosCadastro dadosCadastro) {
		this.dadosCadastro = dadosCadastro;
	}

	public List<Animal> getAnimais() {
		return animais;
	}

	public void setAnimais(List<Animal> animais) {
		this.animais = animais;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + codigo;
		result = prime * result
				+ ((dadosCadastro == null) ? 0 : dadosCadastro.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Cliente other = (Cliente) obj;
		if (codigo != other.codigo)
			return false;
		if (dadosCadastro == null) {
			if (other.dadosCadastro != null)
				return false;
		} else if (!dadosCadastro.equals(other.dadosCadastro))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "Cliente [codigo=" + codigo + ", dadosCadastro=" + dadosCadastro
				+ "]";
	}

	public Cliente clone() {
		Cliente cliente = new Cliente();
		cliente.setCodigo(codigo);
		cliente.setDadosCadastro(dadosCadastro.clone());
		//cliente.setAnimais(lista);
		return cliente;
	}

}
